/**
 * 密码验证工具
 * 验证规则：
 * 1. 长度在8-20位之间
 * 2. 包含至少一个大写字母
 * 3. 包含至少一个小写字母
 * 4. 包含至少一个数字
 * 5. 包含至少一个特殊字符(!@#$%^&*()_+-=[]{}|;:,.<>?等)
 */

// 密码验证正则表达式
const PASSWORD_REGEX = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?]).{8,20}$/;

/**
 * 验证密码是否符合安全要求
 * @param password 需要验证的密码字符串
 * @returns 验证结果对象，包含是否有效和错误信息
 */
export function validatePassword(password: string): {
  isValid: boolean;
  errors: string[];
} {
  const errors: string[] = [];

  // 检查长度
  if (password.length < 8) {
    errors.push("密码长度不能少于8个字符");
  }
  if (password.length > 20) {
    errors.push("密码长度不能超过20个字符");
  }

  // 检查小写字母
  if (!/[a-z]/.test(password)) {
    errors.push("密码必须包含至少一个小写字母");
  }

  // 检查大写字母
  if (!/[A-Z]/.test(password)) {
    errors.push("密码必须包含至少一个大写字母");
  }

  // 检查数字
  if (!/\d/.test(password)) {
    errors.push("密码必须包含至少一个数字");
  }

  // 检查特殊字符
  if (!/[!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?]/.test(password)) {
    errors.push("密码必须包含至少一个特殊字符(!@#$%^&*等)");
  }

  return {
    isValid: errors.length === 0,
    errors,
  };
}

/**
 * 密码强度评分（0-100）
 * @param password 密码字符串
 * @returns 密码强度分数
 */
export function getPasswordStrength(password: string): number {
  let score = 0;

  // 基础长度评分
  if (password.length >= 8) score += 20;
  if (password.length >= 12) score += 10;
  if (password.length >= 16) score += 10;

  // 字符类型评分
  if (/[a-z]/.test(password)) score += 15;
  if (/[A-Z]/.test(password)) score += 15;
  if (/\d/.test(password)) score += 15;
  if (/[!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?]/.test(password)) score += 15;

  return score;
}
